package com.airlines.crewassignment.service.linkline;

import java.util.Date;
import java.util.List;

import com.airlines.base.config.response.ResponseResult;
import com.airlines.crewassignment.domain.FlightInfo;
import com.airlines.crewassignment.domain.LinkLine;
import com.airlines.crewassignment.entity.linkline.TaskLoop;
import com.airlines.crewassignment.entity.linkline.fullcalendar.Event;
import com.airlines.crewassignment.entity.linkline.fullcalendar.EventForFlight;
import com.airlines.crewassignment.entity.linkline.fullcalendar.Resource;

/**
 * @author xxxx
 * @date 2018年6月14日 
 * @description
 */
public interface FullCalendarService {
	/**
	 * 查询某一天的日历Y轴信息
	 * @param dutyCode
	 * @param flightDate
	 * @return
	 */
	List<Resource> listResource(String dutyCode,Date flightDate);
	/**
	 * 查询某一天的连线日历对象
	 * @param dutyCode
	 * @param flightDate
	 * @return
	 */
	@Deprecated
	List<Event> listEvent(String dutyCode,Date flightDate);
	
	List<EventForFlight> listEventForFlight(String dutyCode,Date flightDate);
	
	/**
	 * 查询未组连线航班
	 * @param dutyCode
	 * @param flightDate
	 * @return
	 */
	List<FlightInfo> listFlightNotHaveCrewLinkLine(String dutyCode,Date flightDate);
	
	/**
	 * 查询某个连线的已组航班
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	List<FlightInfo> listFlight(String dutyCode,Date flightDate,int crewLinkLineNo);
	
//	/**
//	 * 查询某个连线的任务环的所有连线信息
//	 * @param crewLinkLineId
//	 * @return
//	 */
//	@Deprecated
//	List<Event> listEventBySameLoopIdFact(int crewLinkLineId);
//	
//	/**
//	 * 查询某段时间内没有任务环的连线
//	 * @param flightDateStart
//	 * @param flightDateEnd
//	 * @return
//	 */
//	@Deprecated
//	List<Event> listEventNotHaveLoopIdFact(String dutyCode,Date flightDateStart, Date flightDateEnd);
	
	/**
	 * 获取一个连线号
	 * @param dutyCode
	 * @param flightDate
	 * @return
	 */
	int getNewCrewLinkLineNo(String dutyCode,Date flightDate);
	
	/**
	 * 检查一个航班是否能加入到连线中
	 * @param flightId
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	ResponseResult<String> addFlightToLinkLineCk(int flightId,String dutyCode, Date flightDate,int crewLinkLineNo);
	
	/**
	 * 将一个航班添加到连线中
	 * @param flightId
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 */
	void addFlightToLinkLine(int flightId, String dutyCode, Date flightDate, int crewLinkLineNo,String taskLoopFact);
	
	
	/**
	 * 查询属于同一个任务环的航班
	 * @param crewLinkLineId
	 * @return
	 */
	List<FlightInfo> listFlightBySameTaskLoopFact(String dutyCode, Date flightDate,int crewLinkLineNo);
	
	/**
	 * 查询属于同一个任务环的航班,并且同属于flightDate 这天的
	 * @param crewLinkLineId
	 * @return
	 */
	List<FlightInfo> listFlightBySameTaskLoopFactSameFlightDate(String dutyCode, Date flightDate,int crewLinkLineNo);
	

	/**
	 * 查询没有任务环的航班
	 * @param dutyF
	 * @param flightDateStart
	 * @param flightDateEnd
	 * @return
	 */
	List<FlightInfo> listFlightNotHaveTaskLoopFact(String dutyCode, Date flightDateStart, Date flightDateEnd);
	
	/**
	 * 检查一个航班是否可以从连线中删除
	 * @param flightId
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	ResponseResult<String> removeFlightFromLinkLineCk(int flightId, String dutyCode, Date flightDate,
			int crewLinkLineNo);
	/**
	 * 将一个航班从连线中删除
	 * @param flightId
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 */
	void removeFlightFromLinkLine(int flightId, String dutyCode);
	/**
	 * 将航班从一个连线，移动到另外一个连线
	 * @param flightId
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNoOld
	 * @param crewLinkLineNoNew
	 */
	void moveFlight(int flightId, String dutyCode, Date flightDate, int crewLinkLineNoOld,	int crewLinkLineNoNew);
	
	/**
	 * 判断该天的连线是否允许调整
	 * @param flightDateStart
	 * @param flightDateEnd
	 * @return
	 */
	boolean flightDateCk(Date flightDateStart,Date flightDateEnd);
	

	
	/**
	 * 是否可以删除一个连线
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	ResponseResult<String> deleteLinkLineCk(String dutyCode,Date flightDate, int crewLinkLineNo);
	/**
	 * 删除一个连线
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 */
	void deleteLinkLine(String dutyCode, Date flightDate, int crewLinkLineNo);
	/**
	 * 将某个连线上的航班，删除原来的任务环，创建一个新的任务环
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 */
	void createNewTaskLoopFact(String dutyCode, Date flightDate, Integer crewLinkLineNo);
	
	/**
	 * 将某个连线下对应的所有航班的任务环，更改到另外一个任务环中
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param crewLinkLineNoOther
	 */
	void moveTaskLoop(String dutyF, Date flightDate, Integer crewLinkLineNo,int crewLinkLineNoMoveTo);
	
	/**
	 * 根据航班，判断该航班是否属于该flightDate，如果属于，则返回初始的LinkLine(String dutyCode, Date flightDate, int crewLinkLineNo)
	 * 如果不属于，则抛弃 Date flightDate, int crewLinkLineNo，查询flightId所在的flightDate和原来 Date flightDate, int crewLinkLineNo所在的任务环航班对应天的连线
	 * @param flightId
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	LinkLine getOrInitLinkLine(int flightId, String dutyCode, Date flightDate, int crewLinkLineNo);
	/**
	 * 删除任务环检查
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	ResponseResult<String> deleteTaskLoopCk(String dutyCode, Date flightDate, Integer crewLinkLineNo);
	/**
	 * 删除整个任务环
	 * @param dutyF
	 * @param flightDate
	 * @param crewLinkLineNo
	 */
	void deleteTaskLoop(String dutyCode, Date flightDate, Integer crewLinkLineNo);
	
	/**
	 * 检查某一天的连线是否可以生效
	 * @param dutyCode
	 * @param flightDate
	 * @return
	 */
	ResponseResult<String> confirmCk(String dutyCode, Date flightDate);
	
	/**
	 * 对某一天的连线进行确认
	 * @param dutyCode
	 * @param flightDate
	 */
	void confirm(String dutyCode, Date flightDate);
	
	/**
	 * 计算服务，根据dutyCode，从flightInfo中计算航班连线号
	 * @param flightInfo
	 * @param dutyCode
	 * @return
	 */
	Integer getCrewLinkLineNo(FlightInfo flightInfo, String dutyCode);
	
	/**
	 * 将某个航线设置为差航线
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param badRoute
	 */
	void badRoute(String dutyCode, Date flightDate, Integer crewLinkLineNo, Boolean badRoute);
	
	/**
	 * 查询某个航线的任务环概要信息
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @return
	 */
	TaskLoop getTaskLoopInfo(String dutyCode, Date flightDate, Integer crewLinkLineNo);
	
	/**
	 * 将某个航线设置最少男性
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param minMale
	 */
	void minMale(String dutyCode, Date flightDate, Integer crewLinkLineNo, Integer minMale);
	/**
	 * 将某个航线设置为国际航线并差6时区
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param internationalTimeZoneMore6
	 */
	void internationalTimeZoneMore6(String dutyCode, Date flightDate, Integer crewLinkLineNo,
			Boolean internationalTimeZoneMore6);
	
	/**
	 * 
	 * @param dutyCode
	 * @param flightDate
	 * @param crewLinkLineNo
	 * @param crewType
	 */
	void updateCrewTypeId(String dutyCode, Date flightDate, Integer crewLinkLineNo, Integer crewType);
}
